<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF8" />
<meta name="keywords" content="php,tidy,スクレイピング,API,Webサービス" />
<meta name="description" content="phpによるスクレイピング処理入門" />
<title>phpによるスクレイピング処理入門：はてなブックマークの情報を取得</title>
<link href="style.css" rel="stylesheet" type="text/css">
</head>
<?php
define(INIT_URL , "http://murasou.jp");
// proxyを利用する場合は 1 / 利用しない場合は0
$use_proxy = 0;
$proxy_host = 'proxy.example.com';
$proxy_port = 8080;
$no_proxy = array(
    'localhost',        // localhost 
    '127.0.0.0/8',      // loopback
);
include('../init/proxy.php');
function get_html($url){
    $rdata = http_request($url);
    $data = mb_convert_encoding($rdata['data'],"utf-8","auto");
    return ($data);
}
function dump_nodes_title(tidyNode $node, &$urls = NULL) {
    $urls = (is_array($urls)) ? $urls : array();
    if(isset($node->id)) {
    // ここからが実際のスクレイピング処理と思ってよいでしょう。
        // $node->id が Aタグだったら
        if($node->id == TIDY_TAG_A) {
            // $node->id に class属性がセットされていれば
            if (isset($node->attribute['class'])){
                // $node->id の class属性値がbookmarkだったら
                if (stristr ($node->attribute['class'] ,"bookmark") !==FALSE){
                    // <a href="http://ryouchi.seesaa.net/">りょーち</a>
                    // の場合、「りょーち」の文字を取得するには、
                    // $node->child[0]->value
                    // http://ryouchi.seesaa.net/ の文字を取得するには、
                    // $node->attribute['href']
                    // $urls にtitle,linkの連想配列として、タイトルとリンクを格納
                    $urls[] = array("title" => $node->child[0]->value ,"link" =>$node->attribute['href']);
                }
            }
        }
    // ここまでが実際のスクレイピング処理と思ってよいでしょう。
    }
    // 更に子供のノードが存在すれば、再帰的にdump_nodes_title()を繰り返す
    if($node->hasChildren()) {
        foreach($node->child as $c) {
            dump_nodes_title($c, $urls);
        }
    }
    // 連想配列をリターン
    return $urls;
}
echo '<a href="'.INIT_URL.'">'.INIT_URL.'</a><br />';
// INIT_URLで指定されたHTMLファイルを取得して$dataに格納
$data = get_html(INIT_URL);
// Tidy関数で整形する際のおまじない。
$config = array('indent' => TRUE,
                'output-xhtml' => TRUE,
                'wrap' => 200);
// 取得したHTMLファイルの内容をUTF-8の文字コードで$configで
// 指定した設定で、tidyオブジェクトを作成
$tidy = tidy_parse_string($data, $config, 'UTF8');
// cleanRepairで整形
$tidy->cleanRepair();
// 作成したtidyオブジェクトのbody要素の内容をdump_nodes_title()に渡す
// $urlsにはtitle,linkのペアの配列が格納されている。
$urls = dump_nodes_title($tidy->body());
echo '<div align="left"><ul>';
// 取得されたurlsをforeachで回す
foreach ($urls as $item){
    // $item['link'] / $item['title'] を出力
    echo '<li><a href="'.$item['link'].'" target="_blank">'.$item['title'].'</a>';
}
echo '</ul></div>';
?>
</body>
</html>